package com.xsd.prc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Description: 多线程之间按顺序调用 练习
 * @Author: zhoufuzong
 * @Created: 2020-12-30 21:24:16
 * @Version: 1.1.0
 */

class ShareResource{

    private int number =1; // 1 Ａ,2B,3C

    private Lock lock = new ReentrantLock();

    private Condition condition1  = lock.newCondition();
    private Condition condition2  = lock.newCondition();
    private Condition condition3  = lock.newCondition();

    public void print5(){

        lock.lock();
        try {

             // 判断

            while (number != 1) {
                condition1.await();
            }
            // 干活
            for (int i = 1; i <=5 ; i++) {
                System.out.println(Thread.currentThread().getName()+"\t"+i);
            }
            // 通知
            number =2;
            condition2.signal();


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void print10(){
        lock.lock();
        try {

            // 判断
            while (number != 2) {
                condition2.await();
            }
            // 干活
            for (int i = 1; i <10 ; i++) {
                System.out.println(Thread.currentThread().getName()+"\t"+i);

            }

            //通知
            number=3;
            condition3.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    public void print15(){

        lock.lock();
        try {
            // 判断
            while (number != 3) {
                condition3.await();
            }

            // 干活
            for (int i = 1; i <15 ; i++) {
                System.out.println(Thread.currentThread().getName()+"\t"+i);
            }

            // 通知
            number=1;
            condition1.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

public class ThreadOrderAccess {

    public static void main(String[] args) {
       ShareResource shareResource = new ShareResource();

       new Thread(()->{
           for (int i = 0; i <5 ; i++) {
               shareResource.print5();

           }
       },"A").start();

       new Thread(()->{
           for (int i = 0; i <5 ; i++) {
               shareResource.print10();

           }
       },"B").start();

       new Thread(()->{
           for (int i = 0; i <5 ; i++) {
               shareResource.print15();

           }
       },"C").start();
    }
}
